#pragma once

#include  "iostream"
#include  "vector"
#include  "stack"
#include  "unordered_map"
#include   "queue"

using namespace std;

/*
 *166. 分数到小数
提示
中等
444
相关企业
给定两个整数，分别表示分数的分子 numerator 和分母 denominator，以 字符串形式返回小数 。

如果小数部分为循环小数，则将循环的部分括在括号内。

如果存在多个答案，只需返回 任意一个 。

对于所有给定的输入，保证 答案字符串的长度小于 104 。



示例 1：

输入：numerator = 1, denominator = 2
输出："0.5"
示例 2：

输入：numerator = 2, denominator = 1
输出："2"
示例 3：

输入：numerator = 4, denominator = 333
输出："0.(012)"
 *
 *
 *
 *
 *
 * */

//todo 有一点需要知道分数,要不是循环小数要不就能除尽
string fractionToDecimal(int numerator, int denominator) {
    string ret = "";
    long long num = abs((long long) numerator);
    long long den = abs((long long) denominator);
    unordered_map<int, int> mp;
    if (numerator < 0 && denominator > 0 || (numerator > 0 && denominator < 0))
        ret += '-';
    long long out = num / den;
    long long rem = num % den;//4
    ret += to_string(num / den);
    if (rem == 0) //完全除尽了 余数为0   =====>那玩意其实求的 是 商 商用除号
        return ret;

    ret += '.';
    //例如 4/333
    // 这边其实需要自己模拟除法的 自己4/333 通常会怎么做 0.01201201
    // 4%333 =4        4/333=0
    // 4*10 %333=40    40/333=0
    // 40*10 %333=67    400/333=1
    // 670%333=10       670/333=2

    string s = "";
    int pos = 0;
    while (rem != 0) {
        if (mp.find(rem) != mp.end()) {
            s.insert(mp[rem], "(");
            s += ')';//尾部直接补)即可
            return ret + s;
        }

        mp[rem] = pos++;//记录字符串位置
        //例如 4/333
        // rem 余数 不等于0 表示没有除完
        //
        s += to_string((rem * 10) / den);
        rem = (rem * 10) % den;
    }

    return ret + s;//否则就是可以除jin的

}
